'''
Created on 29 mars 2011

@author: paraita


    Pour la quantiteALire:
    en fait c'est en meme temps la taille d'une periode mais aussi
    la quantite a ecrire dans le haut parleur (sinon le son n'est pas joued en PCM_NONBLOCK)
    et enfin doit etre un multiple de la size d'une frame



'''
import alsaaudio
import audioop
import time
import struct

def makeEchoEffect(freq=8000, quantiteALire=512, duree=5, retard=2, attenuation=0.7):
    '''
    Enregistre le micro un certain nombre de secondes
    y ajoute un effet d'echo
    et rejoue le signal resultant sur les haut parleurs
    '''
    nbSecondes = duree
    nbSecondesRetard = retard
    
    '''
        initialisation --------------------------------------
    '''
    inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL)
    out = alsaaudio.PCM(alsaaudio.PCM_PLAYBACK, alsaaudio.PCM_NORMAL)
    
    inp.setchannels(1)
    inp.setrate(freq)
    inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
    inp.setperiodsize(quantiteALire)
    
    out.setchannels(1)
    out.setrate(freq)
    out.setformat(alsaaudio.PCM_FORMAT_S16_LE)
    out.setperiodsize(quantiteALire)
    
    
    '''
        on ecoute et on copie dans un tableau ----------------
    '''
    startFlag = time.time()
    fini = False
    enregistrement = []
    print "enregistrement de " + str(nbSecondes) + " secondes en cours:"
    
    while not fini:
        l,data = inp.read()
        if l:
            for k in range(l):
                dataAAjouter = audioop.getsample(data, 2, k)
                enregistrement.append(dataAAjouter)
        endFlag = time.time()
        if (endFlag - startFlag) >= nbSecondes:
            fini = True
            
    
    '''
        ajout du retard pour creer l'effet d'echo
    '''
    
    # je cree un tableau qui va avoir nbSecondesRetard de retard
    print "creation du retard:"
    echo = []
    for i in range(int(nbSecondesRetard*1000)):
        echo.append(0)
        
    # je colle l'audio ensuite
    for i in enregistrement:
        echo.append(i)
    
    print "creation du signal final:"
    final = []
    for sample in range(len(enregistrement)):
        nouveauSamp = enregistrement[sample]+(attenuation*echo[sample])
        final.append(nouveauSamp)
    
    '''
        on ecoute ce qu'on a enregistred dans le tableau -----
    '''
    
    print "lecture en cours:"
    for e in final:
        out.write(struct.pack('<h',e))
    print "fini"


def makeReverseEffect(freq=8000, quantiteALire=512, duree=5):
    '''
    Enregistre le micro un certain nombre de secondes
    fabrique le signal reversed
    et le joue sur les haut parleurs
    '''
    
    nbSecondes = duree
    
    '''
        initialisation --------------------------------------
    '''
    inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL)
    out = alsaaudio.PCM(alsaaudio.PCM_PLAYBACK, alsaaudio.PCM_NORMAL)
    
    inp.setchannels(1)
    inp.setrate(freq)
    inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
    inp.setperiodsize(quantiteALire)
    
    out.setchannels(1)
    out.setrate(freq)
    out.setformat(alsaaudio.PCM_FORMAT_S16_LE)
    out.setperiodsize(quantiteALire)
    
    '''
        on ecoute et on copie dans un tableau ----------------
    '''
    startFlag = time.time()
    fini = False
    enregistrement = []
    print "enregistrement de " + str(nbSecondes) + " secondes en cours:"
    
    while not fini:
        l,data = inp.read()
        if l:
            for k in range(l):
                dataAAjouter = audioop.getsample(data, 2, k)
                enregistrement.append(dataAAjouter)
        endFlag = time.time()
        if (endFlag - startFlag) >= nbSecondes:
            fini = True
    
    '''
        effet de son reversed
    '''
    final = []
    for i in range(len(enregistrement)):
        final.append(enregistrement[len(enregistrement)-1-i])
    
    '''
        on ecoute ce qu'on a enregistred dans le tableau -----
    '''
    
    print "lecture:"
    for e in final:
        out.write(struct.pack('<h',e))
    print "fini"

        
def main():
    #makeEchoEffect()
    makeReverseEffect()
    pass
    
    
    
    
            
            
            


if __name__ == '__main__':
    main()